package com.cskaoyan.javase.oop2._2polymorphic._0introduction;

/**
 * 多态的引入
 * 什么是多态?
 * 从字面意义上理解，同一个事物，在不同的时刻/情况表现出不同的状态，就可以称之为多态。
 * 在Java中,多态指的是:
 * 同一个事物: 同一个父类引用
 * 不同的情况: 指向不同的子类对象
 * 表现出不同的状态: 调用同名方法时,体现出不同的行为
 *
 * 总结来说，Java中的多态指的是，同一个父类引用指向不同子类对象时，调用同名成员方法，根据指向实际对象的不同，得到的行为也会随之不不同。
 *
 * 总结一下多态的使用条件:
 *      1.多态的前提是继承,没有父子类,没有多态
 *      2.子类要重写父类中的方法
 *      3.父类引用指向不同的子类对象
 *
 * 反过来,总结一下不能发生多态的场景:
 *      1.不能继承的类. final修饰的类
 *      2.不能重写的方法.
 *          a.final修饰的方法
 *          b.static静态方法
 *          c.构造器
 *          d.私有方法
 *      3.写代码保证
 *
 * @since 10:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 同一个父类引用
        Person p;
        // 指向不同的子类对象
        p = new Student();
        p.eat();
        p = new Teacher();
        p.eat();
        p = new Boss();
        p.eat();
    }
}

class Person {
    public void eat() {
        System.out.println("吃饭");
    }
}

class Student extends Person {
    @Override
    public void eat() {
        System.out.println("用筷子吃饭!");
    }
}

class Teacher extends Person {
    @Override
    public void eat() {
        System.out.println("我不吃饭!");
    }
}

class Boss extends Person {
    @Override
    public void eat() {
        System.out.println("我吃山珍海味!");
    }
}